#ifndef FILTER_PAGES_H
#define FILTER_PAGES_H

#include <QWidget>
#include <QtGui>

class GrayScalePage : public QWidget{
	Q_OBJECT

    public:
        GrayScalePage(QWidget *parent = 0);
};

class NegativePage : public QWidget{
	Q_OBJECT

    public:
        NegativePage(QWidget *parent = 0);
};

class LogPage : public QWidget{
	Q_OBJECT

    public:
        LogPage(QWidget *parent = 0);
};

class PowerPage : public QWidget{
	Q_OBJECT

    public:
        PowerPage(QWidget *parent = 0);

        double getGamma();

    signals:
        void done();

    private slots:
        void changeGamma(double);

    private:
        double gamma;
};

class ThresholdingPage : public QWidget{
	Q_OBJECT

    public:
        ThresholdingPage(QWidget *parent = 0);

        int getThreshold();

    signals:
        void done();

    private slots:
        void changeThreshold(int);

    private:
        int threshold;
};

class HistogramEqualizationPage : public QWidget{
	Q_OBJECT

    public:
        HistogramEqualizationPage(QWidget *parent = 0);
};

class HistogramMatchingPage : public QWidget{
	Q_OBJECT

    public:
        HistogramMatchingPage(QWidget *parent = 0);

    signals:
        void done();
};

class LocalHistogramProcessingPage : public QWidget{
	Q_OBJECT

    public:
        LocalHistogramProcessingPage(QWidget *parent = 0);

        int getM();
        int getN();
        void tryItAgain();

    signals:
        void done();

    private slots:
        void changeM(int);
        void changeN(int);
        void tryIt();

    private:
        int m, n;
        QPushButton *tryItButton;
};

class LocalHistogramProcessingWithStatisticsPage : public QWidget{
	Q_OBJECT

    public:
        LocalHistogramProcessingWithStatisticsPage(QWidget *parent = 0);

        int getM();
        int getN();
        double getK0();
        double getK1();
        double getK2();
        double getE();
        void tryItAgain();

    signals:
        void done();

    private slots:
        void changeM(int);
        void changeN(int);
        void changeK0(double);
        void changeK1(double);
        void changeK2(double);
        void changeE(double);
        void tryIt();

    private:
        int m, n;
        double k0, k1, k2, e;
        QPushButton *tryItButton;
        QDoubleSpinBox *k1DoubleSpinBox;
};

class AveragePage : public QWidget{
	Q_OBJECT

    public:
        AveragePage(QWidget *parent = 0);

        int getM();
        int getN();
        void tryItAgain();

    signals:
        void done();

    private slots:
        void changeM(int);
        void changeN(int);
        void tryIt();

    private:
        int m, n;
        QPushButton *tryItButton;
};

class WeightedAveragePage : public QWidget{
	Q_OBJECT

    public:
        WeightedAveragePage(QWidget *parent = 0);

        int getM();
        int getN();
        void tryItAgain();

    signals:
        void done();

    private slots:
        void changeM(int);
        void changeN(int);
        void tryIt();

    private:
        int m, n;
        QPushButton *tryItButton;
};

class GaussianPage : public QWidget{
	Q_OBJECT

    public:
        GaussianPage(QWidget *parent = 0);

        int getM();
        int getN();
        double getSigma();
        void tryItAgain();

    signals:
        void done();

    private slots:
        void changeM(int);
        void changeN(int);
        void changeSigma(double);
        void tryIt();

    private:
        int m, n;
        double sigma;
        QPushButton *tryItButton;
};

class OrderStatisticPage : public QWidget{
	Q_OBJECT

    public:
        OrderStatisticPage(QWidget *parent = 0);

        int getM();
        int getN();
        int getPosition();
        void tryItAgain();

    signals:
        void done();

    private slots:
        void changeM(int);
        void changeN(int);
        void changePosition(int);
        void tryIt();

    private:
        int m, n;
        int position;
        QPushButton *tryItButton;
};

class LaplacianPage : public QWidget{
	Q_OBJECT

    public:
        LaplacianPage(QWidget *parent = 0);

        int getType1();
        int getType2();
        void tryItAgain();

    signals:
        void done();

    private slots:
        void changeType1(int);
        void changeType2(int);
        void tryIt();

    private:
        int type1, type2;
        QPushButton *tryItButton;
};

class UnsharpMaskingAndHighboostPage : public QWidget{
	Q_OBJECT

    public:
        UnsharpMaskingAndHighboostPage(QWidget *parent = 0);

        int getType();
        int getM();
        int getN();
        double getSigma();
        void tryItAgain();

    signals:
        void done();

    private slots:
        void changeType(int);
        void changeM(int);
        void changeN(int);
        void changeSigma(double);
        void tryIt();

    private:
        int type, m, n;
        double sigma;
        QDoubleSpinBox *sigmaDoubleSpinBox;
        QLabel* sigmaLabel;
        QPushButton *tryItButton;
};

class GradientPage : public QWidget{
	Q_OBJECT

    public:
        GradientPage(QWidget *parent = 0);

        int getType();
        void tryItAgain();

    signals:
        void done();

    private slots:
        void changeType(int);
        void tryIt();

    private:
        int type;
        QPushButton *tryItButton;
};

#endif
